import math


def calculate_hotness(event_data, min_max_values, weights, k=0.1):
    """
    计算事件热度值

    参数:
    event_data (dict): 事件数据，格式为 {指标名: {'value': 原始值, 'time_diff': 时间差(天)}}
    min_max_values (dict): 各指标的最小最大值，格式为 {指标名: (最小值, 最大值)}
    weights (dict): 各指标权重，格式为 {指标名: 权重}
    k (float): 时间衰减系数，默认0.1

    返回:
    float: 热度值（范围[0,1)）
    """
    hotness = 0.0

    for indicator, data in event_data.items():
        # 获取原始值和时间差
        raw_value = data['value']
        time_diff = data['time_diff']

        # 数据标准化
        min_val, max_val = min_max_values[indicator]
        if max_val == min_val:
            normalized = 0.0  # 防止除以零
        else:
            normalized = (raw_value - min_val) / (max_val - min_val)

        # 时间衰减计算
        time_weight = math.exp(-k * time_diff)

        # 获取指标权重
        weight = weights[indicator]

        # 累加计算
        hotness += weight * normalized * time_weight

    return hotness


# 示例用法
if __name__ == "__main__":
    # 事件数据（假设各指标时间差不同）
    event_data = {
        'social_media': {'value': 800, 'time_diff': 1},  # 社交媒体互动，1天前数据
        'news_articles': {'value': 40, 'time_diff': 2},  # 新闻报道量，2天前数据
        'search_index': {'value': 7000, 'time_diff': 0}  # 搜索指数，最新数据
    }

    # 各指标的最小最大值（需根据实际数据调整）
    min_max_values = {
        'social_media': (0, 1000),  # 假设互动量范围0-1000
        'news_articles': (0, 100),  # 假设报道量范围0-100
        'search_index': (0, 10000)  # 假设搜索量范围0-10000
    }

    # 权重分配
    weights = {
        'social_media': 0.4,
        'news_articles': 0.3,
        'search_index': 0.3
    }

    # 计算热度值
    hotness = calculate_hotness(event_data, min_max_values, weights)
    print(f"事件热度值: {hotness:.4f}")  # 输出: 0.5979